/**
 * Created by Administrator on 2017/5/25.
 */

var express = require('express');
var router = express.Router();

var UserDao = require('../dao/users.js');
var Log = require('../dao/log.js');
require('../util/userHelper.js');
require('../util/common.js');
var VerifyCodeDao = require("../dao/verify_code");
var UserToken = require('../db/user_tokens.js');
var UserAppDao = require('../dao/user_app.js');
var AppAdminDao = require('../dao/app_admin');
var UserAgentDao = require('../dao/user_agent');
var UserOnlineDao = require('../dao/user_online');
var config = require('../config');
var global_var = require('../global_var');
var UsersRouter = module.exports;

/**
 * 申请验证码
 * http://<tao_server:port>/users/applyVCode
 * param: phone type app_sid(可选)
 */
function verifyCheck(req, par, res) {
    VerifyCodeDao.verifyCheck(req, par, function (err, result) {
        if (err) {
            res.json(new ERR(err, 400));
        }
        else {
            res.json(new PKG(result));
        }
    })
}

UsersRouter.applyVCode = function (req, res) {

    //拿到他的请求参数
    var par = paramAll(req);
    if (!par.app_sid) {
        res.json(new ERR('请先选择产品', 400));
        return;
    }

    if (!par.type) {
        res.json(new ERR('请先选择使用类型', 400));
        return;
    }

    //第一步：验证手机号是否正确（其实这一块是可以写在客户端的，减少服务端的工作量）
    // 验证130-139,150-159,180-189号码段的手机号码
    var myreg = /^(1)[0-9]{10}$/;

    if (!par.phone || par.phone.length != 11 || !myreg.test(par.phone)) {
        res.json(new ERR('phone必须是手机号', 400));
        return;
    }

    //第二步：自己生成验证码，将参数封装
    //生成6为数字的随机数
    var code = '';
    for (var i = 0; i < 6; i++) {
        code += Math.floor(Math.random() * 10);
    }
    par.code = code;
    if (par.app_sid == 'duoke') {
        if (par.wx_unionid) {
            // UserDao.checkExistWxUnionid(par.wx_unionid, function(e, isExist) {
            //     if(e) return res.json(new ERR(e, 400));
            //     if(!isExist) return res.json(new ERR('请重授权微信号！', 400));
            //     verifyCheck(req, par, res);
            // });
            verifyCheck(req, par, res);
        } else if (par.app_sign && par.app_time) {
            par.app_key = par.app_sid;
            if (!checkSrvConnection(par)) return res.json(new ERR('无访问权限', 400));
            verifyCheck(req, par, res);
        } else if (par.iv && par.encryptedData) {
            verifyCheck(req, par, res);
        } else {
            return res.json(new ERR('缺少必要参数！', 400));
        }
    } else {
        verifyCheck(req, par, res);
    }
};

router.post('/applyVCode', UsersRouter.applyVCode);

UsersRouter.vfyCode = function (req, res) {

    //拿到他的请求参数
    var par = paramAll(req);
    if (!par.app_sid) return res.json(new ERR('请先选择产品', 400));
    if (!par.verifycode) return res.json(new ERR('请输入验证码不为空！', 400));
    if (!par.type || par.type != '2') return res.json(new ERR('type不为空或输入不正确！', 400));
    if (!par.token) return res.json(new ERR('token不为空！', 400));
    par.time = new Date();
    par.ip = req.ip;

    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) return res.json(new ERR('请先登录', 403));
        par.account = loginInfo.account;
        par.app_sid = loginInfo.app_sid;
        VerifyCodeDao.verifyCode(par, function (err, data) {
            if (err) return res.json(new ERR(err, 400));
            res.json(new PKG('验证成功'));
        });
    });
    
};

router.post('/vfyCode', UsersRouter.vfyCode);

/**
 * 用户登录
 * http://<tao_server:port>/users/login
 * @param account  password app_sid
 */
UsersRouter.login = function (req, res) {
    var par = paramAll(req);
    if (!par.account) {
        res.json(new ERR('账号不能为空！', 400));
        return;
    }
    if (!par.password) {
        res.json(new ERR('密码不能为空！', 400));
        return;
    }

    var userInfo = {};

    userInfo.account = par.account;
    userInfo.app_sid = par.app_sid;
    par.password = encryPassword(par.password);
    userInfo.password = par.password;
    UserDao.loginAll(userInfo, function (err, r) {
        if (err) {
            if (!r) {
                res.json(new ERR(err, 400));
                return;
            }
            par.detail = err;
            par.uid = r;
            par.type = 4;//用户登陆失败
            Log.userLog(par, function (result) {
                res.json(new ERR(err, 400));
            });

        } else {
            UserToken.onLogin(r, function (err, data) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                console.log(r);
                r.token = data;
                r.type = 0;//登陆
                r.detail = '登录成功！';
                Log.userLog(r, function (result) {
                    if (!result) return res.json(new ERR(err, 400));
                    delete r.password;
                    delete r.detail;
                    delete r.type;
                    res.json(new PKG(r));
                });
            });
        }
    });
}

router.post('/login', UsersRouter.login);

/**
 * 用户微信登录
 * /users/wxlogin
 * @param wx_unionid app_sid
 */
UsersRouter.wxlogin = function (req, res) {
    var par = paramAll(req);
    if (!par.wx_unionid) return res.json(new ERR('微信唯一识别id不能为空！', 400));
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    wxLogin(par, res);
}

router.post('/wxlogin', UsersRouter.wxlogin);

//微信登录逻辑：
// 1、未注册平台的，查询下微信隐藏推荐人并返回；
// 2、注册平台的登录后，
// 2.1有推荐人的直接返回，
// 2.2无推荐人的查一下是否要设置微信推荐人返回，同时需要设置微信推荐人的设置
function wxLogin(par, res) {
    UserDao.wxlogin(par, function (err, r) {
        if (err) return res.json(new ERR(err, 400));
        if (r.isVisitor == true) { //游客身份，查询微信推荐人返回
            UserDao.getWxRecCode({app_sid: par.app_sid, wx_unionid: par.wx_unionid}, function (e, wxCode) {
                if (e) return res.json(new ERR(e, 400));
                if (par.code_type) {
                    r.passVersion = (global_var.config && global_var.config[par.app_sid + '_' + par.code_type]
                        && global_var.config[par.app_sid + '_' + par.code_type].value) ?
                        global_var.config[par.app_sid + '_' + par.code_type].value : undefined;
                } else {
                    r.passVersion = (global_var.config && global_var.config[par.app_sid + '_duoke_program']
                        && global_var.config[par.app_sid + '_duoke_program'].value) ?
                        global_var.config[par.app_sid + '_duoke_program'].value : undefined;
                }
                r.wxRecommendCode = (wxCode == 0) ? null : uidToCode(wxCode);
                return res.json(new PKG(r));
            });
            return;
        }
        UserToken.onLogin(r, function (err, data) {
            if (err) return res.json(new ERR(err, 400));
            r.token = data;
            r.type = 0; //登陆
            r.detail = '登录成功！';
            Log.userLog(r, function (result) {
                if (!result) return res.json(new ERR(err, 400));
                delete r.detail;
                delete r.type;
                if (par.code_type) {
                    r.passVersion = (global_var.config && global_var.config[par.app_sid + '_' + par.code_type]
                        && global_var.config[par.app_sid + '_' + par.code_type].value) ?
                        global_var.config[par.app_sid + '_' + par.code_type].value : undefined;
                } else {
                    r.passVersion = (global_var.config && global_var.config[par.app_sid + '_duoke_program']
                        && global_var.config[par.app_sid + '_duoke_program'].value) ?
                        global_var.config[par.app_sid + '_duoke_program'].value : undefined;
                }
                var hasRecommender = r && r.appInfo && r.appInfo[0] && r.appInfo[0].hasRecommender; //没有推荐人，查一下微信推荐人并设置
                if (!hasRecommender) {
                    UserDao.getWxRecCode({app_sid: par.app_sid, wx_unionid: par.wx_unionid}, function (e, wxRecUid) {
                        if (e) return;
                        if (wxRecUid) UserDao.setRecommender({
                            uid: r.uid,
                            recommendUid: wxRecUid,
                            app_sid: par.app_sid,
                            account: r.account
                        });
                        return res.json(new PKG(r));
                    });
                } else {//有推荐人的直接返回了
                    return res.json(new PKG(r));
                }
            });
        });
    });
}

/**
 * 用户微信登录
 * /users/wxlogin
 * @param wx_unionid app_sid
 */
UsersRouter.wxLoginByCode = function (req, res) {
    var par = paramAll(req);
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.code) return res.json(new ERR('code不为空！', 400));
    if (!par.code_type) return res.json(new ERR('code_type不为空！', 400));
    UserAgentDao.getWXunionid(par, function (err, data) {
        if (err) return res.json(new ERR(err, 400));
        par.wx_unionid = data.unionid;
        wxLogin(par, res);
    });
}

router.post('/wxLoginByCode', UsersRouter.wxLoginByCode);

/**
 * 第三方用户绑定手机号
 * /users/bindAccount
 * @param wx_unionid、app_sid、account、verifycode, password, recommendCode, code, iv, encryptedData
 */
function bindAccount(par, res) {
    UserDao.bindAccount(par, function (err, r) {
        if (err) return res.json(new ERR(err, 400));
        UserToken.onLogin(r, function (err, data) {
            if (err) return res.json(new ERR(err, 400));
            r.token = data;
            delete r.password;
            Log.userLog({uid: r.uid, account: r.account, type: 0, detail: '绑定手机号, 登录'}, function () {
            });
            var hasRecommender = ( r.appInfo && r.appInfo[0] && r.appInfo[0].hasRecommender == 0) ? false : true;
            if (par.recommendCode && !hasRecommender) {
                UserDao.setRecommender({
                    uid: r.uid,
                    recommendUid: codeToUid(par.recommendCode),
                    app_sid: par.app_sid,
                    account: r.account
                });
                r.appInfo[0].hasRecommender = 1;
            }
            res.json(new PKG(r));
        });
    });
}

UsersRouter.bindAccount = function (req, res) {
    var par = paramAll(req);
    if ((!par.wx_unionid) && (!par.code && !par.iv && !par.encryptedData)) return res.json(new ERR('微信唯一识别id不能为空！', 400));
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.account) return res.json(new ERR('账号不能为空！', 400));
    if (!par.verifycode) return res.json(new ERR('验证码不能为空！', 400));
    if (!par.password) par.password = new Date().getTime();
    if (par.recommendCode) {
        UserDao.checkRCCode({uid:codeToUid(par.recommendCode),app_sid:par.app_sid},function (err,result) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            if (!result.isRight) {
                res.json(new ERR('推荐码有误!', 400));
                return;
            }
            bindAccountAfterCheckCode(par,req,res);
        });
        return;
    }
    bindAccountAfterCheckCode(par,req,res);
};
router.post('/bindAccount', UsersRouter.bindAccount);

function bindAccountAfterCheckCode(par,req,res) {
    par.time = new Date();
    par.type = 3;
    par.ip = req.ip;
    par.password = encryPassword(par.password);
    VerifyCodeDao.verifyCode(par, function (err, data) {
        if (err) return res.json(new ERR(err, 400));
        if (data.length > 0) {
            if (par.wx_unionid) {
                bindAccount(par, res);
            } else {
                UserAgentDao.getMinProWXunionid(par, function (e, d) {
                    if (e || (d && !d.unionid)) return res.json(new ERR('绑定失败,请重试!', 400));
                    if (d.unionid) {
                        par.wx_unionid = d.unionid;
                        bindAccount(par, res);
                    }
                });
            }
        }
    });
}


/**
 * 查看是否有微信推荐人
 * /users/getWxRec
 * @param app_sid、token
 */
UsersRouter.getWxRec = function (req, res) {
    var par = paramAll(req);
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.token) return res.json(new ERR('请重新登录！', 400));
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) return res.json(new ERR('请先登录', 403))
        par.uid = loginInfo.uid;
        UserDao.getWxRec(par, function (err, r) {
            if (err) {
                res.json(new ERR(err, 400));
            } else {
                res.json(new PKG(r));
            }
        });
    });
}

router.post('/getWxRec', UsersRouter.getWxRec);

/**
 * 查看是否有微信推荐人,直接设置推荐人
 * /users/setWxRec
 * @param app_sid、token
 */
UsersRouter.setWxRec = function (req, res) {
    var par = paramAll(req);
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.token) return res.json(new ERR('请重新登录！', 400));
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) return res.json(new ERR('请先登录', 403))
        par.uid = loginInfo.uid;
        par.account = loginInfo.account;
        UserDao.setWxRec(par, function (err, r) {
            if (err) {
                res.json(new ERR(err, 400));
            } else {
                res.json(new PKG(r));
            }
        });
    });
}

router.post('/setWxRec', UsersRouter.setWxRec);

/**
 * 绑定微信号
 * /users/bindWx
 * @param token、wx_unionid、app_sid
 */
UsersRouter.bindWx = function (req, res) {
    var par = paramAll(req);
    if (!par.wx_unionid) return res.json(new ERR('微信唯一识别id不能为空！', 400));
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.token) return res.json(new ERR('请重新登录！', 400));
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) return res.json(new ERR(err));
        par.uid = loginInfo.uid;
        par.account = loginInfo.account;
        UserDao.bindWx(par, function (err, r) {
            if (err) {
                res.json(new ERR(err, 400));
            } else {
                res.json(new PKG(r));
            }
        });
    });
}

router.post('/bindWx', UsersRouter.bindWx);

/**
 * 短信登录
 * /users/vcodeLogin
 * @param verifycode、account、app_sid
 */
UsersRouter.vcodeLogin = function (req, res) {
    var par = paramAll(req);
    if (!par.verifycode) return res.json(new ERR('验证码不能为空！', 400));
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.account) return res.json(new ERR('账号不能为空！', 400));
    par.time = new Date();
    par.type = 4;
    par.ip = req.ip;
    VerifyCodeDao.verifyCode(par, function (err, data) {
        if (err) return res.json(new ERR(err, 400));
        if (data.length > 0) {
            UserDao.vcodeLogin(par, function (e, r) {
                if (e) return res.json(new ERR(e, 400));
                UserToken.onLogin(r, function (err, data) {
                    if (err) return res.json(new ERR(err, 400));
                    r.token = data;
                    Log.userLog({uid: r.uid, account: r.account, type: 0, detail: '短信登录成功！'}, function () {
                    });
                    res.json(new PKG(r));
                });
            });
        }
    });
}

router.post('/vcodeLogin', UsersRouter.vcodeLogin);

/**
 * 短信登录，未登录的用默认密码注册
 * /users/vcAutoLogin
 * @param verifycode、account、app_sid
 */
UsersRouter.vcAutoLogin = function (req, res) {
    var par = paramAll(req);
    if (!par.verifycode) return res.json(new ERR('验证码不能为空！', 400));
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.account) return res.json(new ERR('账号不能为空！', 400));
    par.time = new Date();
    par.type = 4;
    par.ip = req.ip;
    VerifyCodeDao.verifyCode(par, function (err, data) {
        if (err) return res.json(new ERR(err, 400));
        if (data.length > 0) {
            UserDao.vcodeLogin(par, function (e, r) {
                if (e == '还未注册该应用！') {
                    vcAutoRegister(par,res);
                    return;
                }
                if (e) return res.json(new ERR(e, 400));
                UserToken.onLogin(r, function (err, data) {
                    if (err) return res.json(new ERR(err, 400));
                    r.token = data;
                    Log.userLog({uid: r.uid, account: r.account, type: 0, detail: '短信登录成功！'}, function () {
                    });
                    res.json(new PKG(r));
                });
            });
        }
    });
};

router.post('/vcAutoLogin', UsersRouter.vcAutoLogin);

function vcAutoRegister(par,res) {
    par.password = 'autoReg2018';
    par.password = encryPassword(par.password);
    if (!par.app_sid) {
        res.json(new ERR('请先选择产品', 400));
        return;
    }
    var userInfo = {};
    userInfo.account = par.account;
    userInfo.verifycode = par.verifycode;
    userInfo.password = par.password;
    userInfo.ip = par.ip;
    userInfo.app_sid = par.app_sid;
    userInfo.time = new Date();
    userInfo.type = 0;
    if (par.source) {
        userInfo.source = par.source;
    }
    if (par.recommendCode) {
        userInfo.recommendCode = par.recommendCode;
    }
    if (par.qq) {
        userInfo.qq = par.qq;
    }
    _doRegister(userInfo, par, res);
}
/**
 * 判断是否注册平台  是否绑定微信  是否注册app  是否有推荐人,有rc的情况顺便判断rc是否有效
 * /users/existInfo
 * @param account  app_sid  rc(选填)
 */
UsersRouter.existInfo = function (req, res) {
    var par = paramAll(req);
    if (!par.app_sid) return res.json(new ERR('产品参数不能为空！', 400));
    if (!par.account) return res.json(new ERR('账号不能为空！', 400));
    UserDao.existInfo(par, function (err, data) {
        if (err) return res.json(new ERR(err, 400));
        res.json(new PKG(data));
    });
}

router.post('/existInfo', UsersRouter.existInfo);

/**
 * 子账号登主账号
 * http://<tao_server:port>/users/loginSub
 * @param account main_uid app_sid password
 */
UsersRouter.loginSub = function (req, res) {
    var par = paramAll(req);
    var userInfo = {};
    if (!par.account) {
        res.json(new ERR('account is null', 400));
        return;
    }
    if (!par.main_uid) {
        res.json(new ERR('main_uid is null', 400));
        return;
    }
    if (!par.password) {
        res.json(new ERR('password is null', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('app_sid is null', 400));
        return;
    }
    userInfo.account = par.account;
    userInfo.main_uid = par.main_uid;
    userInfo.app_sid = par.app_sid;
    par.password = encryPassword(par.password);
    userInfo.password = par.password;

    UserDao.loginSub(userInfo, function (err, data) {
        if (err) {
            // userInfo.detail = err;
            // userInfo.uid = 0;
            // userInfo.type = 4;
            // Log.userLog(userInfo, function (result) {
            //     if (result) {
            //         res.json(new ERR(err, 400));
            //     }
            // });
            res.json(new ERR(err, 400));
        } else {
            userInfo = data;
            console.log(data);
            userInfo.server_time = simpleDateFormat(new Date());
            console.log(userInfo);
            UserToken.onLogin(userInfo, function (err, data) {
                if (err) {
                    console.log(err);
                    return;
                }
                userInfo.token = data;
                // userInfo.comment = '子账号登陆成功';
                // userInfo.type = 0;//登陆
                // userInfo.detail = '子账号'+ userInfo.uid +'登录成功！';
                // Log.userLog(userInfo, function (result) {
                //     if (result) {
                //         delete userInfo.password;
                //         delete userInfo.detail;
                //         delete userInfo.app_sid;
                //         delete userInfo.type;
                res.json(new PKG(userInfo));
                //     }
                // });
            });
        }
    });
}

router.post('/loginSub', UsersRouter.loginSub);

/**
 * 新用户注册
 * http://<tao_server:port>/users/regist
 * @param account  password verifycode app_sid
 */
UsersRouter.register = function (req, res) {

    var par = paramAll(req);
    if (!par.account) {
        res.json(new ERR('账号不能为空', 400));
        return;
    }
    if (!par.password) {
        res.json(new ERR('密码不能为空', 400));
        return;
    }
    par.password = encryPassword(par.password);
    if (!par.verifycode) {
        res.json(new ERR('验证码不能为空', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('请先选择产品', 400));
        return;
    }
    var userInfo = {};
    userInfo.account = par.account;
    userInfo.verifycode = par.verifycode;
    userInfo.password = par.password;
    userInfo.ip = req.ip;
    userInfo.app_sid = par.app_sid;
    userInfo.time = new Date();
    userInfo.type = 0;
    if (par.source) {
        userInfo.source = par.source;
    }
    if (par.recommendCode) {
        userInfo.recommendCode = par.recommendCode;
    }
    if (par.qq) {
        userInfo.qq = par.qq;
    }

    VerifyCodeDao.verifyCode(userInfo, function (err, data) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (data.length > 0) {
            _doRegister(userInfo, par, res);
        }
    })
};

router.post('/regist', UsersRouter.register);

UsersRouter.registerByJf = function(req, res){
    var par = paramAll(req);
    if (!par.account) {
        res.json(new ERR('账号不能为空', 400));
        return;
    }
    if (!par.password) {
        res.json(new ERR('密码不能为空', 400));
        return;
    }
    par.password = encryPassword(par.password);
    if (!par.app_sid) {
        res.json(new ERR('请先选择产品', 400));
        return;
    }
    var userInfo = {};
    userInfo.account = par.account;
    userInfo.password = par.password;
    userInfo.ip = req.ip;
    userInfo.app_sid = par.app_sid;
    userInfo.time = new Date();
    userInfo.type = 0;
    if (par.source) {
        userInfo.source = par.source;
    }
    if (par.recommendCode) {
        userInfo.recommendCode = par.recommendCode;
    }
    if (par.qq) {
        userInfo.qq = par.qq;
    }

    console.log(userInfo);
    console.log(par);

    _doRegister(userInfo, par, res);
}

router.post('/registerByJf', UsersRouter.registerByJf);

/**
 * 合作平台自动注册,加服务器间校验
 *
 */
UsersRouter.platRegister = function (req, res) {

    var par = paramAll(req);
    console.log(par);
    if (!checkSrvConnection(par)) return res.json(new ERR('访问受限', 400));
    if (!par.account) return res.json(new ERR('账号不能为空', 400));
    if (!par.password) return res.json(new ERR('密码不能为空', 400));
    par.password = encryPassword(par.password);
    if (!par.app_sid) return res.json(new ERR('请先选择产品', 400));
    var userInfo = {};
    userInfo.account = par.account;
    userInfo.password = par.password;
    userInfo.app_sid = par.app_sid;
    userInfo.time = new Date();
    if (par.plat) userInfo.reg_plat = par.plat;
    userInfo.type = 0;
    if (par.source) {
        userInfo.source = par.source;
    }
    if (par.recommendCode) {
        userInfo.recommendCode = par.recommendCode;
    }
    if (par.qq) {
        userInfo.qq = par.qq;
    }
    _doRegister(userInfo, par, res);
};

router.post('/plat_regist', UsersRouter.platRegister);

function _doRegister(userInfo, par, res) {
    userInfo.type = 3;
    UserDao.register(userInfo, function (err, r) {
        if (err) {
            userInfo.detail = err;
            userInfo.uid = 0;
            Log.userLog(userInfo, function (result) {
                if (result) {
                    res.json(new ERR(err, 400));
                }
            });
            return;
        }
        userInfo = r;
        UserToken.onLogin(userInfo, function (err, data) {
            if (err) {
                console.log(err);
                res.json(new ERR(err, 400));
                return;
            }
            userInfo.token = data;
            delete userInfo.verifycode;
            delete userInfo.time;
            delete userInfo.password;
            delete userInfo.ip;
            delete userInfo.source;
            Log.userLog(userInfo, function (result) {
                if (result) {
                    delete userInfo.detail;
                    delete userInfo.type;
                    //联盟先不用加进去
                    // userInfo.member_num = 0;
                    // userInfo.unionName = '';
                    res.json(new PKG(userInfo));
                }
            });
        });
    });
}

/**
 * 用户修改密码
 * http://<tao_server:port>/users/resetPwd
 * @param  token   password
 */
UsersRouter.resetPwd = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        var userInfo = {};
        userInfo.uid = loginInfo.uid;
        userInfo.type = 1; //日志修改密码

        if (!par.oldpassword) return res.json(new ERR('旧密码不能为空', 400));
        if (!par.password) return res.json(new ERR('新密码不能为空', 400));


        userInfo.oldpassword = encryPassword(par.oldpassword);
        userInfo.password = encryPassword(par.password);
        UserDao.isPassword(userInfo, function (err, data) {
            if (err) {
                userInfo.detail = err;
                userInfo.account = data.account;
                Log.userLog(userInfo, function (result) {
                    if (result) {
                        res.json(new ERR(err, 400));
                    }
                });
                return;
            }
            userInfo.account = data.account;
            UserDao.resetPwd(userInfo, function (err) {
                if (err) {
                    userInfo.detail = err;
                    Log.userLog(userInfo, function (result) {
                        if (result) {
                            res.json(new ERR(err, 400));
                        }
                    });
                    return;
                }
                delete userInfo.password;
                delete userInfo.oldpassword;
                UserToken.updateToToken(userInfo, function (e, result) {
                    if (e) {
                        userInfo.detail = e;
                        Log.userLog(userInfo, function (data) {
                            if (data) {
                                res.json(new ERR('修改密码失败', 400));
                            }
                        });
                    } else {
                        userInfo.detail = '重置密码成功！';
                        Log.userLog(userInfo, function (data) {
                            if (data) {
                                delete userInfo.type;
                                userInfo.token = result;
                                res.json(new PKG(userInfo));
                            }
                        });
                    }
                });
            });
        });
    });
}

router.post('/resetPwd', UsersRouter.resetPwd);

/**
 * 用户修改手机号
 * http://<tao_server:port>/users/changeAccount
 * @param  token  verifycode   password
 */
UsersRouter.changeAccount = function (req, res) {
    var par = paramAll(req);
    if (!par.newAccount) {
        res.json(new ERR('新账号不能为空', 400));
        return;
    }
    if (!par.password) {
        res.json(new ERR('密码不能为空', 400));
        return;
    } else {
        par.password = encryPassword(par.password);
    }
    if (!par.verifycode) {
        res.json(new ERR('验证码不能为空', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('请先选择产品', 400));
        return;
    }

    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        var userInfo = {};
        userInfo.uid = loginInfo.uid;
        userInfo.account = loginInfo.account;
        userInfo.type = 5; //日志修改账号

        UserDao.isPassword({uid:loginInfo.uid, oldpassword:par.password}, function (err, data) {
            if (err) {
                userInfo.detail = err;
                userInfo.account = data.account;
                Log.userLog(userInfo, function (result) {
                    if (result) {
                        res.json(new ERR(err, 400));
                    }
                });
                return;
            }
            // data.account, data.type, data.app_sid
            VerifyCodeDao.verifyCode({
                account:par.newAccount, type:0, app_sid:par.app_sid, verifycode:par.verifycode, ip:req.ip
            }, function (err, data) {
                if (err) {
                    res.json(new ERR(err, 400));
                    return;
                }
                UserDao.changeAccount({uid:loginInfo.uid, oldAccount:loginInfo.account, newAccount:par.newAccount}, function (err) {
                    if (err) {
                        userInfo.detail = err;
                        Log.userLog(userInfo, function (result) {
                            if (result) {
                                res.json(new ERR(err, 400));
                            }
                        });
                        return;
                    }
                    userInfo.detail = '重置账号成功，新账号：' + par.newAccount;
                    Log.userLog(userInfo, function (isSuc) {});
                    UserToken.delSubs(loginInfo.uid, function (err, data) { });
                    UserToken.onLogout(par.token, function (err, data) { });
                    res.json(new PKG(userInfo));
                });
            });
        });
    });
}

router.post('/changeAccount', UsersRouter.changeAccount);

/**
 * token登录
 * http://<tao_server:port>/users/tokenToLogin
 * @param  token
 */
UsersRouter.tokenToLogin = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token 不为空', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            console.log(err);
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        delete loginInfo.time;
        loginInfo.app_sid = par.app_sid;

        UserDao.getUserInfo(loginInfo, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            if (data) {
                loginInfo.account = data.account;
                loginInfo.name = data.name;
                loginInfo.age = data.age == null ? "" : data.age;
                loginInfo.id_card = data.id_card == null ? "" : data.id_card;
                loginInfo.wx_account = data.wx_account == null ? "" : data.wx_account;
                loginInfo.ali_account = data.ali_account == null ? "" : data.ali_account;
                loginInfo.recommendCode = uidToCode(data.uid);
                loginInfo.money = 0;
                loginInfo.real_name = data.real_name;
                loginInfo.secret_pwd = data.secret_pwd ? true : false;
            }
        });

        loginInfo.appInfo = [];
        UserDao.hasRecommender(loginInfo.uid, function (e, result) {
            if (e) {
                res.json(new ERR(e, 400));
            } else {
                var applist = [];
                for (var i = 0; i < result.length; i++) {
                    var recommender = result[i].recommender;
                    var app_sid = result[i].app_sid;
                    if (!loginInfo.app_sid) loginInfo.money += result[i].money;
                    if (loginInfo.app_sid && loginInfo.app_sid == app_sid) loginInfo.money = result[i].money;
                    if (applist.indexOf(app_sid) < 0) {
                        if (loginInfo.app_sid && app_sid != loginInfo.app_sid) {
                        } else {
                            applist.push(app_sid);
                            var hasRecommender = 0;
                            if (recommender) {
                                hasRecommender = 1;
                            }
                            ;
                            if (loginInfo.app_sid) {
                                if (result[i].status == 0) {
                                    var err = {};
                                    err.status = '已被禁用';
                                    err.comment = result[i].comment;
                                    res.json(new ERR(err, 400));
                                    return;
                                }
                            }
                            var applists = {
                                app_sid: applist[i],
                                app_name: result[i].name,
                                hasRecommender: hasRecommender,
                                status: result[i].status,
                                comment: result[i].comment
                            }
                            loginInfo.appInfo.push(applists);
                        }
                    }
                }
                UserDao.getVipInfo(loginInfo, function (e, data) {
                        if (e) {
                            res.json(new ERR(e, 400));
                        } else {
                            if (data) {
                                for (var i = 0; i < loginInfo.appInfo.length; i++) {
                                    var ob = [];
                                    var viplists = {};
                                    for (var j = 0; j < data.length; j++) {
                                        if (data[j].app_sid == applist[i]) {
                                            loginInfo.isEndTime = vipEndTime(data[j].end_time);
                                            if (loginInfo.isEndTime.can_use == 1) {
                                                // loginInfo.recommendCode = uidToCode(loginInfo.uid);
                                            }
                                            loginInfo.isEndTime.vip_end_time = simpleDateFormat(loginInfo.isEndTime.vip_end_time);
                                            var vipInfo = {
                                                vip_sid: data[j].vip_sid,
                                                vip_name: data[j].name,
                                                end_time: loginInfo.isEndTime.vip_end_time,
                                                vip_level: data[j].lvl,
                                                can_use: loginInfo.isEndTime.can_use
                                            }
                                            ob.push(vipInfo);
                                            delete loginInfo.isEndTime;
                                        }
                                    }
                                    ob.forEach(function (o) {
                                        viplists[o.vip_sid] = o;
                                    });
                                    loginInfo.appInfo[i].vipInfo = viplists;
                                }
                            }
                            var server_time = new Date();
                            loginInfo.server_time = simpleDateFormat(server_time);
                            UserDao.getAppkey(loginInfo.uid, data.app_sid, function (err, appkey) {
                                if (err) {
                                    return res.json(new ERR(err, 400));
                                } else {
                                    delete loginInfo.app_sid;
                                    delete loginInfo.password;
                                    loginInfo.appkey = (appkey && appkey[0] && appkey[0].appkey) ? appkey[0].appkey : null;
                                    res.json(new PKG(loginInfo));
                                }
                            });
                        }
                    }
                );
            }
        });
    });
}

router.post('/tokenToLogin', UsersRouter.tokenToLogin);

/**
 * 用户退出
 * http://<tao_server:port>/users/logout
 * @param  token
 */
UsersRouter.logout = function (req, res) {
    var par = paramAll(req);
    var token = par.token;
    UserToken.onLogout(token, function (err, data) {
        if (err) {
            return;
        }
        if (data) {
            res.json(new PKG('退出成功！'));
        } else {
            res.json(new ERR('failed', 400));
        }
    });
}
router.post('/logout', UsersRouter.logout);

/**
 * 忘记密码
 * http://<tao_server:port>/users/forgetPwd
 * @param  account password verifycode
 */
UsersRouter.forgetPwd = function (req, res) {
    var par = paramAll(req);
    if (!par.account) {
        res.json(new ERR('账号不能为空', 400));
        return;
    }
    if (!par.password) {
        res.json(new ERR('密码不能为空', 400));
        return;
    } else {
        par.password = encryPassword(par.password);
    }
    if (!par.verifycode) {
        res.json(new ERR('验证码不能为空', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('请先选择产品', 400));
        return;
    }
    var userInfo = {};
    userInfo.account = par.account;
    userInfo.password = par.password;
    userInfo.verifycode = par.verifycode;
    userInfo.app_sid = par.app_sid;
    userInfo.ip = req.ip;
    userInfo.type = 1;//忘记密码
    userInfo.time = new Date();
    VerifyCodeDao.verifyCode(userInfo, function (err, data) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (data.length > 0) {
            userInfo.type = 2;//忘记密码
            UserDao.forgetPwd(userInfo, function (err) {
                if (err) {
                    userInfo.detail = err;
                    Log.userLog(userInfo, function (result) {
                        if (result) {
                            res.json(new ERR(err, 400));
                        }
                    });
                    return;
                } else {
                    userInfo.detail = '重置密码成功！';
                    Log.userLog(userInfo, function (result) {
                        if (result) {
                            delete userInfo.type;
                        }
                    });
                    UserDao.getUid(userInfo.account, function (err, result) {
                        if (err) {
                            console.log(err);
                        } else {
                            userInfo.uid = result.uid;
                            UserToken.updateToToken(userInfo, function (err, data) {
                                if (err) {
                                    console.log(err);
                                    return;
                                }
                                userInfo.token = data;
                                delete userInfo.detail;
                                delete userInfo.password;
                                delete userInfo.time;
                                delete userInfo.verifycode;
                                delete userInfo.ip;
                                res.json(new PKG(userInfo));
                            });
                        }
                    });
                }
            });
        }
    });
}
router.post('/forgetPwd', UsersRouter.forgetPwd);

/**
 * 管理员查找用户
 * http://<tao_server:port>/users/findUsers
 * @param token,startTime,endTime,phone
 */
UsersRouter.findUsers = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }

    var isTime = par.startTime || par.endTime;
    if (!par.phone && !isTime) {
        res.json(new ERR('搜索条件不足', 400));
        return;
    }

    //管理员才能搜索用户
    UserToken.checkLogin(par.token, function (err, loginInfo) {

        if (err) {
            console.log(err);
            res.json(new ERR('服务器异常', 400));
            return;
        }

        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        if (!loginInfo.isAdmin) {//用户 尾号搜索
            res.json(new ERR('无访问权限', 400));
            return;
        }

        if (par.phone) {//验证手机号是否正确,或者是否是尾号

            if (par.phone.length != 4 && par.phone.length != 11) {
                res.json(new ERR('请输入手机号或手机尾号', 400));
                return;
            }

            if (isNaN(par.phone)) {
                res.json(new ERR('手机号格式有误', 400));
                return;
            }

            var myreg = /^(13|15|18|14|17)[0-9]{9}$/;
            if (par.phone.length == 11 && !myreg.test(par.phone)) {
                res.json(new ERR('手机号格式有误', 400));
                return;
            }
        }

        var userInfo = {};
        if (par.phone && par.phone.length == 4) userInfo.phoneTail = true; //里面用phoneTail判断是不是尾号查询
        userInfo.startTime = par.startTime;
        userInfo.endTime = par.endTime;
        userInfo.account = par.phone;
        userInfo.app_sid = par.app_sid;
        UserDao.usersInfoByTimeAndPhone(userInfo, function (err, result) {
            if (err) {
                console.log(err);
                res.json(new ERR('服务器异常', 400));
                return;
            }

            if (result.users[0]) {
                res.json(new PKG(result));
            } else {
                res.json(new ERR('该用户不存在', 400));
            }
        });

    });

}

router.post('/findUsers', UsersRouter.findUsers);

/**
 * 编辑管理员或用户信息
 * http://<tao_server:port>/users/updateUser
 * @param token，uid，status（选），age（选），sex（选），addr（地址），email(邮箱)
 */
UsersRouter.updateUser = function (req, res) {
    var par = paramAll(req);

    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }

    UserToken.checkLogin(par.token, function (err, loginInfo) {

        if (err) {
            res.json(new ERR('服务器异常', 400));
            return;
        }

        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        if (loginInfo.isAdmin) {//管理员

            if (!par.uid) {
                res.json(new ERR('用户id不能为空', 400));
                return;
            }

            if (!par.account) {
                res.json(new ERR('用户账号不能为空', 400));
                return;
            }

            if (par.app_sid) {
                //不是系统管理员或产品管理员
                if (loginInfo.role.indexOf('admin') < 0 && loginInfo.role.indexOf('adm_' + par.app_sid)) {
                    res.json(new ERR('无访问权限', 400));
                    return;
                }
            } else {
                if (loginInfo.role.indexOf('admin') < 0) {
                    res.json(new ERR('无访问权限', 400));
                    return;
                }
            }
        } else {//用户自己登录
            par.uid = loginInfo.uid;
        }

        //构造信息修改
        var usersInfo = {};
        if (loginInfo.isAdmin && par.status) {//只有管理员可修改用户状态
            if (par.status != 1 && par.status != 0) {
                res.json(new ERR('参数格式错误', 400));
                return;
            }
            usersInfo.status = par.status;
        }
        if (par.age) {
            if (!isNaN(par.age)) {
                res.json(new ERR('参数格式有误', 400));
                return;
            }
            usersInfo.age = par.age;
        }
        if (par.sex) {
            if (par.sex != '男' && par.sex != '女') {
                res.json(new ERR('参数格式有误', 400));
                return;
            }
            usersInfo.sex = par.sex;
        }
        if (par.addr) usersInfo.addr = par.addr;
        if (par.name) usersInfo.name = par.name;
        if (par.qq) usersInfo.qq = par.qq;

        if (par.email) {
            var myreg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
            if (!myreg.test(par.email)) {
                res.json(new ERR('参数格式有误', 400));
                return;
            }
            usersInfo.email = par.email;
        }

        if (par.aliAccount) usersInfo.ali_account = par.aliAccount;
        if (par.wxAccount) usersInfo.wx_account = par.wxAccount;
        if (par.idCard) usersInfo.id_card = par.idCard;

        var data = {};
        data.uid = par.uid;
        data.isAdmin = loginInfo.isAdmin;
        data.usersInfo = usersInfo;
        if (data.isAdmin == true) {
            data.account = par.account;
            data.adm_uid = loginInfo.uid;
            data.uid = par.uid
        }
        if (JSON.stringify(data.usersInfo) == "{}") {
            res.json(new ERR('请填写修改项', 400));
            return;
        }
        UserDao.updateUser(data, function (err, result) {
            if (err) {
                console.log(err);
                res.json(new ERR(err, 400));
                return;
            }
            UserToken.delSubs(data, function (err, r) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                res.json(new PKG(result));
            });
        });

    });
}

router.post('/updateUser', UsersRouter.updateUser);

/**
 * 设置用户的推荐人
 * http://<tao_server:port>/users/setRecommender
 * @param token，app，recommendCode
 */
UsersRouter.setRecommender = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        if (!par.recommendCode) {
            res.json(new ERR("推荐码不能hasApp为空！", 400));
            return;
        }
        loginInfo.recommendCode = par.recommendCode;
        if (!par.app_sid) {
            res.json(new ERR('请选择产品', 400));
            return;
        }
        loginInfo.app_sid = par.app_sid;
        loginInfo.recommendUid = codeToUid(par.recommendCode);
        if (!loginInfo.recommendUid) {
            res.json(new ERR("推荐码错误", 400));
            return;
        } else if (loginInfo.recommendUid == loginInfo.uid) {
            res.json(new ERR("推荐人不能是自己", 400));
            return;
        }

        UserDao.updateRecommender(loginInfo, function (err, result) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            if (result) {
                res.json(new PKG(result));
            } else {
                res.json(new ERR(err, 400));
            }
        })
    });
}

router.post('/setRecommender', UsersRouter.setRecommender);

/**
 * 获取applist列表
 * @param req
 * @param res
 */
UsersRouter.getAppList = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        var userInfo = [];

        if (loginInfo.isAdmin) {

            if (!par.uid) {
                res.json(new ERR('用户标示不为空', 400));
                return;
            }
            if (!par.user_account) {
                res.json(new ERR('用户账号不为空', 400));
                return;
            }
            //检查是不是系统管理员或产品管理员
            var appAdminFlag = loginInfo.role.indexOf('adm_' + par.app_sid) >= 0;
            if (loginInfo.role.indexOf('admin') < 0 && appAdminFlag == false) {
                res.json(new ERR('无权限', 400));
                return;
            }
            loginInfo.uid = par.uid;
            //要传，才能查看vip信息
            loginInfo.account = par.user_account;
        }
        userInfo.app_sid = par.app_sid;
        userInfo.appInfo = [];
        UserAppDao.getAppAgentList(loginInfo.uid, function (e, result) {
            if (e) {
                res.json(new ERR(e, 400));
            } else {
                var applist = [];
                for (var i = 0; i < result.length; i++) {
                    var recommender = result[i].recommender;
                    var app_sid = result[i].app_sid;
                    if (applist.indexOf(app_sid) < 0) {
                        if (userInfo.app_sid && app_sid != userInfo.app_sid) {
                        } else {
                            applist.push(app_sid);
                            var hasRecommender = 0;
                            if (recommender) {
                                hasRecommender = 1;
                            }
                            // var created_time  = JSON.stringify(result[i].created_time);
                            // created_time = created_time.substring(1,created_time.length);
                            var leaveScore = result[i].agent_score - result[i].score;
                            if (leaveScore < 0) {
                                leaveScore = 0;
                            }
                            var created_time = simpleDateFormat(result[i].created_time);
                            var applists = {
                                app_sid: applist[i],
                                app_name: result[i].name,
                                agent_name: result[i].agent_name,
                                group_name: result[i].group_name,
                                recommender: recommender,
                                agentLvl: result[i].agent_lvl,
                                realScore: result[i].score,
                                leaveScore: leaveScore,
                                create_time: created_time,
                                status: result[i].status,
                                comment: result[i].comment
                            }
                            userInfo.appInfo.push(applists);

                        }
                    }
                }
                if (applist.length == 0) {
                    res.json(new ERR('用户没使用该应用！', 400));
                    return;
                }
                UserDao.getVipInfo(loginInfo, function (e, data) {
                        if (e) {
                            res.json(new ERR(e, 400));
                        } else {
                            //现在没有试用期了
                            // loginInfo.probation = probation(data.created_time);
                            if (data) {
                                for (var i = 0; i < userInfo.appInfo.length; i++) {
                                    var viplists = {};
                                    var ob = [];
                                    for (var j = 0; j < data.length; j++) {
                                        if (data[j].app_sid == applist[i]) {
                                            userInfo.isEndTime = vipEndTime(data[j].end_time);
                                            if (userInfo.isEndTime.can_use == 1) {
                                                userInfo.recommendCode = uidToCode(userInfo.uid);
                                            }
                                            //复杂写法
                                            // var vip_end_time  = JSON.stringify(userInfo.isEndTime.vip_end_time);
                                            // vip_end_time = vip_end_time.substring(1,vip_end_time.length);
                                            //这个相对简单
                                            var vip_end_time = simpleDateFormat(userInfo.isEndTime.vip_end_time);
                                            var vipInfo = {
                                                vip_sid: data[j].vip_sid,
                                                vip_name: data[j].name,
                                                end_time: vip_end_time,
                                                vip_level: data[j].lvl,
                                                vip_top_lvl: data[j].top_lvl, can_use: userInfo.isEndTime.can_use
                                            }
                                            ob.push(vipInfo);
                                            delete userInfo.isEndTime;
                                        }
                                    }
                                    ob.forEach(function (o) {
                                        viplists[o.vip_sid] = o;
                                    });
                                    userInfo.appInfo[i].vipInfo = viplists;
                                }
                            }
                            res.json(new PKG(userInfo.appInfo));
                        }
                    }
                );
            }
        });
    })
}
router.post('/getApplist', UsersRouter.getAppList);

/**
 * 得到用户的个人资料

 * users/getUserInfo
 * 系统管理员：token、uid（选）、account（选）、app_sid
 * 产品管理员：token、app_sid（用来验证是否是该产品的管理员）、uid、acount
 * 用户：token

 */
UsersRouter.showUserInfo = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        if (loginInfo.isAdmin) {
            if (!par.uid && !par.account) {
                res.json(new ERR('参数有误', 400));
                return;
            }

            console.log("dd");
            //检查是不是系统管理员或产品管理员
            var appAdminFlag = loginInfo.role.indexOf('adm_' + par.app_sid) >= 0;
            if (loginInfo.role.indexOf('admin') < 0 && appAdminFlag == false) {
                res.json(new ERR('无权限', 400));
                return;
            }

        } else {
            par.uid = loginInfo.uid;
            par.account = loginInfo.account;
        }

        UserDao.showUserInfo(par, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(data));
        });
    });
};

router.post('/getUserInfo', UsersRouter.showUserInfo);

UsersRouter.checkToken = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR("没有该token", 400));
            return;
        }
        var result = {};
        result.uid = loginInfo.uid;
        res.json(new PKG(result));
    })
}
router.post('/checkToken', UsersRouter.checkToken);

UsersRouter.sayOnline = function (req, res) {
    var par = req.body;
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR("没有该token", 400));
            return;
        }
        var data = {
            app_sid:loginInfo.app_sid,
            created_time:new Date(par.created_time),
            end_time:new Date(),
            lastTime:new Date(par.end_time)
        };
        if (loginInfo.main_userInfo) {
            data.uid = loginInfo.main_userInfo.uid;
            data.sub_uid = loginInfo.uid;
        }
        else{
            data.uid = loginInfo.uid;
        }
        UserOnlineDao.updateOnline(
            data,
            function (err, rsp) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                var result = {};
                result.app_sid = loginInfo.app_sid;
                result.uid = loginInfo.uid;
                result.sub_uid = loginInfo.sub_uid;
                result.created_time = rsp.created_time;
                result.end_time = rsp.end_time;
                res.json(new PKG(result));
            }
        );
    })
}
router.post('/sayOnline', UsersRouter.sayOnline);

/**
 * 得到用户的在线次数和时间
 *
 * @param 用户：token
 *
 * @param created_time: 可选的起始时间点，不传默认为当天
 * @param end_time: 可选的结束时间
 */
UsersRouter.getOnline = function (req, res) {
    var par = req.body;
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR("没有该token", 400));
            return;
        }
        var data = {
            app_sid:loginInfo.app_sid,
        };
        if (loginInfo.main_userInfo) {
            data.uid = loginInfo.main_userInfo.uid;
            data.sub_uid = loginInfo.uid;
        }
        else{
            data.uid = loginInfo.uid;
        }
        if(par.created_time){
            data.created_time = par.created_time;
        }
        if(par.end_time){
            data.end_time = par.end_time;
        }
        UserOnlineDao.getOnLineInfo(data,
            function (err, rsp) {
                res.json(new PKG(rsp));
            }
        );
    })
}
router.post('/getOnline', UsersRouter.getOnline);

/**
 * 得到用户的下级代理
 *
 * @param 管理员：token , account(选)
 * @param 用户：token
 */
UsersRouter.getLowAgent = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        if (par.account) {
            //验证管理员身份
            if (!loginInfo.isAdmin) {
                res.json(new ERR('无权限', 400));
                return;
            }
            //检查是不是系统管理员或产品管理员
            var appAdminFlag = loginInfo.role.indexOf('adm_' + par.app_sid) >= 0;
            if (loginInfo.role.indexOf('admin') < 0 && appAdminFlag == false) {
                res.json(new ERR('无权限', 400));
                return;
            }
            loginInfo.account = par.account;
        }
        loginInfo.app_sid = par.app_sid;
        var lowAgentList = {};
        UserAppDao.getLowAgentList(loginInfo, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            // if (data) {
            lowAgentList.lowAgentList = data;
            console.log(loginInfo);
            UserAppDao.getLowAgentList2(loginInfo, function (error, result) {
                if (error) {
                    res.json(new ERR(error, 400));
                    return;
                }
                lowAgentList.lowAgentList2 = result;
                res.json(new PKG(lowAgentList));
            });
        });
    });
};

router.post('/getLowAgent', UsersRouter.getLowAgent);

/**
 * 用户订单明细
 *
 * @param 管理员：token , app_sid , account
 * @param 用户：token , app_sid
 */
UsersRouter.getCommissionList = function (req, res) {
    var par = paramAll(req);
    if (!par.app_sid) {
        res.json(new ERR('app_sid不为空', 400));
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        if (loginInfo.isAdmin && !par.account) {
            res.json(new ERR('account不为空', 400));
            return;
        }

        if (par.account) {
            //验证管理员身份
            if (!loginInfo.isAdmin) {
                res.json(new ERR('无权限', 400));
                return;
            }
            //检查是不是系统管理员或产品管理员
            var appAdminFlag = loginInfo.role.indexOf('adm_' + par.app_sid) >= 0;
            if (loginInfo.role.indexOf('admin') < 0 && appAdminFlag == false) {
                res.json(new ERR('无权限', 400));
                return;
            }
            loginInfo.account = par.account;
        }
        loginInfo.app_sid = par.app_sid;
        var lowAgentList = {};
        UserAppDao.getAgentPriceList(loginInfo, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            lowAgentList.lowAgentList = data;
            UserAppDao.getAgentPriceList2(loginInfo, function (error, result) {
                if (error) {
                    res.json(new ERR(error, 400));
                    return;
                }
                lowAgentList.lowAgentList2 = result;
                res.json(new PKG(lowAgentList));
            });
        });
    });
};

router.post('/getCommissionList', UsersRouter.getCommissionList);


/**
 * 用户佣金明细
 *
 * @param 管理员：token , app_sid , account
 * @param 用户：token , app_sid
 */
UsersRouter.getCommissionList2 = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    if (par.endTime && !par.startTime) {
        res.json(new ERR('起始时间不为空', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        //如果是管理员
        if (loginInfo.isAdmin) {

            //一定要带具体用户账号
            if (!par.account) {
                res.json(new ERR('account不为空', 400));
                return;
            }

            //如果有带产品查询
            if (par.app_sid) {
                //检查是不是系统管理员或产品管理员
                if (loginInfo.role.indexOf('admin') < 0 && loginInfo.role.indexOf('adm_' + par.app_sid) < 0) {
                    cb('无权限', 400);
                    return;
                }
            } else {//如果没带产品查询
                //检查是不是系统管理员
                if (loginInfo.role.indexOf('admin') < 0) {
                    cb('无权限', 400);
                    return;
                }
            }
        } else {//如果不是管理员，直接用token获取account

            par.account = loginInfo.account;
        }
        UserAppDao.getCommission(par, function (err, result) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(result));
        });

    });
};

router.post('/getCommissionList2', UsersRouter.getCommissionList2);

/**
 * 用户报表（固定时间段）
 *
 * @param 系统管理员：token ，app_sid(选)，date:2day,30day,6month
 * @param 产品管理员：token , app_sid，date:2day,30day,6month
 */
UsersRouter.getUserForm = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 400));
            return;
        }
        if (!par.date) {
            res.json(new ERR('请设置时间段', 400));
            return;
        }
        //验证管理员身份
        if (!loginInfo.isAdmin) {
            res.json(new ERR('无权限', 400));
            return;
        }
        //检查是不是系统管理员或产品管理员
        var appAdminFlag = loginInfo.role.indexOf('adm_' + par.app_sid) >= 0;
        if (loginInfo.role.indexOf('admin') < 0 && appAdminFlag == false) {
            res.json(new ERR('无权限', 400));
            return;
        }

        loginInfo.app_sid = par.app_sid;
        loginInfo.date = par.date;

        var userForm = {};

        userForm.appInfo = {};
        UserAppDao.getAppData(loginInfo, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            UserAppDao.getAppRisInfos(loginInfo, function (error, result) {
                if (error) {
                    res.json(new ERR(error, 400));
                    return;
                }
                var applist = {};
                var sum = 0;
                if (result) {
                    result.forEach(function (a) {
                        applist = {
                            app_sid: a.app_sid,
                            app_name: a.name,
                        };
                        applist.data = [];
                        var acount = 0;
                        data.forEach(function (e) {
                            if (e.app_sid == a.app_sid) {
                                applist.data.push(e);
                                acount += e.userCount;
                            }
                        });
                        applist.count = acount;
                        sum += applist.count;
                        userForm.appInfo[a.app_sid] = applist;
                    })
                }
                if (!loginInfo.app_sid) {
                    userForm.sumcount = sum;
                }
                res.json(new PKG(userForm));
            })
        });
    });
};

router.post('/getUserForm', UsersRouter.getUserForm);

/**
 * 用户报表（固定总数）
 *
 * @param 系统管理员：token ，app_sid(选)
 * @param 产品管理员：token , app_sid
 */
UsersRouter.getUserFormCount = function (req, res) {
    var par = paramAll(req);
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 400));
            return;
        }
        //验证管理员身份
        if (!loginInfo.isAdmin) {
            res.json(new ERR('无权限', 400));
            return;
        }
        //检查是不是系统管理员或产品管理员
        var appAdminFlag = loginInfo.role.indexOf('adm_' + par.app_sid) >= 0;
        if (loginInfo.role.indexOf('admin') < 0 && appAdminFlag == false) {
            res.json(new ERR('无权限', 400));
            return;
        }

        if (par.hasOwnProperty("app_sid")) {
            loginInfo.app_sid = par.app_sid;
        }
        var countInfo = [];

        UserAppDao.getAppDateCount(loginInfo, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            if (data) {
                res.json(new PKG(data));
            }
        })

    });
}

router.post('/getUserFormCount', UsersRouter.getUserFormCount);


/**
 * 用户获取产品列表
 */
UsersRouter.allAppList = function (req, res) {

    AppAdminDao.appList(null, function (err, data) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (data) {
            var list = {
                list: data
            }
            res.json(new PKG(list));
        }
    });
}

router.post('/allAppList', UsersRouter.allAppList);

/**
 * 子账号用户获取该主账号的子账号信息
 * @param token、app_sid、group_name(选)
 */
UsersRouter.getEasySubInfo = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        if (loginInfo.main_userInfo) {
            if (loginInfo.main_userInfo.uid) {
                par.uid = loginInfo.main_userInfo.uid;
            }
            // if (loginInfo.vipInfo) {
            //     for (var i = 0; i < loginInfo.vipInfo.length; i++) {
            //         if (loginInfo.vipInfo[i].name.indexOf('分组管理') >= 0) {
            //             par.group_name = loginInfo.group_name;
            //         }
            //     }
            // }
        } else {
            par.uid = loginInfo.uid;
        }
        UserDao.getEasySubInfo(par, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(data));
        });
    });
}

router.post('/getEasySubInfo', UsersRouter.getEasySubInfo);

/**
 * 用户获取子账号|所属分组的信息（各产品）
 * @param token、app_sid、is_sub(是否是子账号)
 */
UsersRouter.getSubInfo = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }

        var data = {};
        if (par.sortWord) data.sortWord = par.sortWord;
        if (par.sub_status) data.sub_status = par.sub_status;
        if (par.sub_mc) data.sub_mc = par.sub_mc;
        if (par.isASC) data.isASC = par.isASC;
        if (par.page) data.page = par.page;
        if (par.pageNum) data.pageNum = par.pageNum;
        if (par.main_account) data.main_account = par.main_account;
        if (par.main_name) data.main_name = par.main_name;
        if (par.sub_account) data.sub_account = par.sub_account;
        if (par.sub_name) data.sub_name = par.sub_name;
        if (par.sub_qq) data.sub_qq = par.sub_qq;
        if (par.group_name) data.group_name = par.group_name;
        data.app_sid = par.app_sid;
        data.is_sub = par.is_sub;
        data.uid = loginInfo.uid;
        //子账号权限
        if (loginInfo.main_userInfo) {
            if(par.getAllName){
                data.uid = loginInfo.main_userInfo.uid;
            }
            else{
                var hasGroupVip = false;
                if (loginInfo.vipInfo) {
                    for (var i = 0; i < loginInfo.vipInfo.length; i++) {
                        if (loginInfo.vipInfo[i].name.indexOf('分组管理') >= 0) {
                            hasGroupVip = true;
                            data.is_sub = 0;
                            data.groupMng = loginInfo.group_name;
                            data.uid = loginInfo.main_userInfo.uid;
                            data.group_uid = loginInfo.uid;
                            data.vipInfo = loginInfo.vipInfo;
                            loginInfo.main_userInfo.vipInfo.forEach(function (o) {
                                if (o.vip_sid == 'subauth') {
                                    data.subLvl = o.lvl;
                                }
                            })
                            data.vipInfo.splice(i, 1);
                        }
                    }

                }
                if (!hasGroupVip || data.groupMng == "" || data.groupMng == null) {
                    res.json(new PKG({}));
                    return;
                }
            }
        }
        UserDao.getSubInfo(data, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(data));
        });
    });
}

router.post('/getSubInfo', UsersRouter.getSubInfo);

/**
 * account、uid互查
 * @param token(管理员token)、account|uid (其中要传一个)
 */
UsersRouter.accountanduid = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    if (!par.account && !par.uid) {
        res.json(new ERR('请传account或uid', 400));
        return;
    }
    UserToken.checkAdminLogin(par.token, par.app_sid, function (err, errCode, loginInfo) {
        if (err) {
            res.json(new ERR(err, errCode));
            return;
        }
        UserDao.accountanduid(par, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(data));
        });
    });
}

router.post('/accountanduid', UsersRouter.accountanduid);

/**
 * 供服务器调用
 * @param group_uid(组员uid)(单个)、main_uid、group_name
 */
UsersRouter.isGroupUid = function (req, res) {
    var par = paramAll(req);

    if (!checkSrvConnection(par)) {
        res.json(new ERR('参数不合法或没有该产品', 400));
        return;
    }

    UserDao.isGroupUid(par, function (err, data) {
        if (err) {
            res.json(new ERR(err, 400));
            console.log(err);
            return;
        }
        res.json(new PKG(data));
    });
}
router.post('/isGroupUid', UsersRouter.isGroupUid);

/**
 * 是否是子账号（供服务器调用）
 * @param sub_uids(子账号uids)、main_uid、group_name(可选)
 */
UsersRouter.isSubUid = function (req, res) {
    var par = paramAll(req);

    if (!checkSrvConnection(par)) {
        res.json(new ERR('参数不合法或没有该产品', 400));
        return;
    }

    UserDao.isSubUid(par, function (err, data) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        res.json(new PKG(data));
    });
}

router.post('/isSubUid', UsersRouter.isSubUid);

/**
 * 是否是子账号（供服务器调用）
 * @param new_account(子账号)、old_uid、main_uid、group_name(可选)
 */
UsersRouter.isSubAccountsForTf = function (req, res) {
    var par = paramAll(req);

    if (!checkSrvConnection(par)) {
        res.json(new ERR('参数不合法或没有该产品', 400));
        return;
    }

    UserDao.isSubAccountsForTf(par, function (err, data) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        res.json(new PKG(data));
    });
}

router.post('/isSubAccountsForTf', UsersRouter.isSubAccountsForTf);

/**
 * 用户添加和更新子账号
 *  users/addSubAccount
 * @param token、app_sid、sub_account、sub_name、sub_auth（要精准，这边没判断）、group_name 、isUpdate(是否更新)（传0|1）、sub_qq
 */
UsersRouter.addorupdateSubAccount = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }

    if (!par.app_sid) {
        res.json(new ERR('app_sid is null', 400));
        return;
    }
    if (!par.isUpdate) {
        res.json(new ERR('isUpdate is null', 400));
        return;
    }
    if (par.isUpdate == '0' && !par.sub_name) {
        res.json(new ERR('请填写子账号昵称', 400));
        return;
    }
    if (par.sub_qq && par.sub_qq % 1 !== 0) {
        res.json(new ERR('qq格式不对', 400));
        return;
    }
    if (!par.sub_account) {
        res.json(new ERR('sub_account is null', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        par.uid = loginInfo.uid;
        //子账号权限
        if (loginInfo.main_userInfo) {
            if (loginInfo.vipInfo) {
                for (var i = 0; i < loginInfo.vipInfo.length; i++) {
                    if (loginInfo.vipInfo[i].name.indexOf('分组管理') >= 0) {
                        par.group_name = loginInfo.group_name;
                        par.uid = loginInfo.main_userInfo.uid;
                    }
                }
            }
        }
        delete par.token;
        UserDao.addorupdateSubAccount(par, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            if (par.isUpdate == '1') {
                UserToken.delSubToken(par, function (err, result) {
                    if (err) {
                        res.json(new ERR(err));
                        return;
                    }
                    res.json(new PKG('操作成功'));
                });
            } else {
                res.json(new PKG('操作成功'));
            }
        });
    });
}

router.post('/addorupdateSubAccount', UsersRouter.addorupdateSubAccount);

/**
 * 用户更新子账号
 *  users/updateSubAccount
 * @param token、app_sid、sub_uid、sub_name、sub_auth（要精准，这边没判断）、group_name 、sub_qq、sub_wx
 */
UsersRouter.updateSubAccount = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('app_sid is null', 400));
        return;
    }
    if (!par.sub_uid) {
        res.json(new ERR('sub_uid is null', 400));
        return;
    }
    if (par.sub_qq && par.sub_qq % 1 !== 0) {
        res.json(new ERR('qq格式不对', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        par.uid = loginInfo.uid;
        //子账号权限
        if (loginInfo.main_userInfo) {
            if (loginInfo.vipInfo) {
                for (var i = 0; i < loginInfo.vipInfo.length; i++) {
                    if (loginInfo.vipInfo[i].name.indexOf('分组管理') >= 0) {
                        par.group_name = loginInfo.group_name;
                        par.uid = loginInfo.main_userInfo.uid;
                    }
                }
            }
        }
        delete par.token;
        UserDao.updateSubAccount(par, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            par.sub_account = data;
            console.log(par);
            UserToken.delSubToken(par, function (err, result) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                res.json(new PKG('操作成功'));
            });
        });
    });
};

router.post('/updateSubAccount', UsersRouter.updateSubAccount);

/**
 * 用户修改子（主）账号状态
 * users/setSubStatus
 * @param 主账号启用或禁用子账号：token、sub_status（传0|1）、sub_uid、app_sid
 * @param 子账号开启或屏蔽主账号：token、uid_status（传0|1）、uid、app_sid
 */
UsersRouter.setSubStatus = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('app_sid is null', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        if (par.uid_status && par.uid) {
            par.sub_uid = loginInfo.uid;
        }
        if (par.sub_status && par.sub_uid) {
            //子账号权限
            if (loginInfo.main_userInfo) {
                if (loginInfo.vipInfo) {
                    for (var i = 0; i < loginInfo.vipInfo.length; i++) {
                        if (loginInfo.vipInfo[i].name.indexOf('分组管理') >= 0) {
                            par.group_name = loginInfo.group_name;
                            par.uid = loginInfo.main_userInfo.uid;
                        }
                    }
                }
            } else {
                par.uid = loginInfo.uid;
            }
        }
        UserDao.setSubStatus(par, function (err, r) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            par.sub_account = r;
            UserToken.delSubToken(par, function (err, result) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                res.json(new PKG('修改成功'));
            });
        });
    });
}

router.post('/setSubStatus', UsersRouter.setSubStatus);

/**
 * 用户修改子（主）账号的入职和离职时间
 * users/setSubJobTime
 * @param 参数：token（主账号）、created_date、quit_date、sub_uid、app_sid
 */
UsersRouter.setSubJobTime = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('app_sid is null', 400));
        return;
    }
    if (!par.sub_uid) {
        res.json(new ERR('sub_uid is null', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        if (loginInfo.main_userInfo) {
            res.json(new ERR('主账号才能操作', 400));
            return;
        }
        par.uid = loginInfo.uid;
        UserDao.setSubJobTime(par, function (err, r) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            par.sub_account = r;
            UserToken.delSubToken(par, function (err, result) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                res.json(new PKG('修改成功'));
            });
        });
    });

}

router.post('/setSubJobTime', UsersRouter.setSubJobTime);

/**
 * 主账号删除子账号
 * users/delSubAccount
 * @param 主账号删除子账号：token、sub_uid、app_sid
 */
UsersRouter.delSubAccount = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不为空', 400));
        return;
    }
    if (!par.app_sid) {
        res.json(new ERR('app_sid is null', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        var param = {};
        if (par.sub_uid) {
            param.sub_uid = par.sub_uid;
        } else {
            res.json(new ERR('子账号不能为空', 400));
            return;
        }
        if (par.app_sid) {
            param.app_sid = par.app_sid;
        } else {
            res.json(new ERR('应用不能为空', 400));
            return;
        }
        //子账号权限
        if (loginInfo.main_userInfo) {
            res.json(new ERR('您没有权限删除子账号', 400));
            return;
        } else {
            param.uid = loginInfo.uid;
        }
        UserDao.delSubAccount(param, function (err, data) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            param.sub_account = data.account;
            UserToken.delSubToken(param, function (err, result) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                res.json(new PKG('删除成功'));
            });
        });
    });

}

router.post('/delSubAccount', UsersRouter.delSubAccount);

/**
 * 用户选择身份登陆(现在用户中心不用选择身份了)
 * http://<tao_server:port>/users/chooseIdentity
 * @param account  password app_sid
 */
UsersRouter.chooseIdentity = function (req, res) {
    var par = paramAll(req);
    var userInfo = {};
    if (!par.account) {
        res.json(new ERR('账号不能为空！', 400));
        return;
    }
    if (!par.password) {
        res.json(new ERR('密码不能为空！', 400));
        return;
    }
    userInfo.account = par.account;
    if (!par.app_sid) {
        res.json(new ERR('app_sid is null', 400));
        return;
    }
    userInfo.app_sid = par.app_sid;
    par.password = encryPassword(par.password);
    userInfo.password = par.password;

    UserDao.login(userInfo, function (err, data) {
        if (err) {
            userInfo.detail = err;
            userInfo.uid = 0;
            userInfo.type = 4;
            Log.userLog(userInfo, function (result) {
                if (result) {
                    res.json(new ERR(err, 400));
                }
            });
        } else {
            userInfo.uid = data.uid;
            userInfo.name = data.name;
            userInfo.account = data.account;

            console.log(userInfo);

            UserDao.chooseIdentity(userInfo, function (err, data) {
                if (err) {
                    res.json(new ERR(err, 400));
                    return;
                }
                res.json(new PKG(data));
            });
        }
    });
}

router.post('/chooseIdentity', UsersRouter.chooseIdentity);

/**
 * 查看账户余额明细
 * http://<tao_server:port>/users/chooseIdentity
 * @param token appSid(可选) uid(可选) startTime(可选) endTime(可选) page(可选) pageNum(可选)
 */
UsersRouter.moneyDetail = function (req, res) {
    var par = paramAll(req);
    if (!par.token) {
        res.json(new ERR('token不能为空！', 400));
        return;
    }

    if (par.endTime && !par.startTime) {
        res.json(new ERR('起始时间不为空', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {

        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        if (loginInfo.isAdmin) {
            if (!par.uid) {
                res.json(new ERR('用户标识不能为空！', 400));
                return;
            }
            //如果有带产品查询
            if (par.appSid) {
                //检查是不是系统管理员或产品管理员
                if (loginInfo.role.indexOf('admin') < 0 && loginInfo.role.indexOf('adm_' + par.appSid) < 0) {
                    res.json(new ERR('无权限！', 400));
                    return;
                }
            } else {//如果没带产品查询
                //检查是不是系统管理员
                if (loginInfo.role.indexOf('admin') < 0) {
                    res.json(new ERR('无权限！', 400));
                    return;
                }
            }
        } else {
            par.uid = loginInfo.uid;
        }
        UserDao.moneyDetail(par, function (err, result) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(result));
        });

    });
}

router.post('/moneyDetail', UsersRouter.moneyDetail);

/**
 * 用户查看自己某项vip权限
 * http://<tao_server:port>/users/getVipSid
 * @param  token、app_sid、vip_sid
 */
UsersRouter.getVipSid = function (req, res) {
    var par = paramAll(req);
    if (!par.app_sid) {
        res.json(new ERR('产品标识不能为空', 400));
        return;
    }
    if (!par.vip_sid) {
        res.json(new ERR('权限标识不能为空', 400));
        return;
    }
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        var param = {};
        param.uid = loginInfo.uid;
        param.vip_sid = par.vip_sid;
        param.app_sid = par.app_sid;
        UserAppDao.getVipSid(param, function (err, result) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(result));
        });
    });
}
router.post('/getVipSid', UsersRouter.getVipSid);

/**
 *用于taoserver自动登录接口
 * @param   account
 * @param   sign
 */
UsersRouter.autoLogin = function (req, res) {
    var par = req.body;
    if (!checkSrvConnection(par)) {
        res.json(new ERR('参数不合法或没有该产品', 400));
    }
    delete par.app_sign;
    delete par.app_time;
    delete par.app_key;
    UserDao.autoLogin(par, function (err, data) {
        if (err) {
            res.json(new ERR(err, 400));
        } else {
            UserToken.onLogin(data, function (err, d) {
                if (err) {
                    res.json(new ERR(err));
                    return;
                }
                data.token = d;
                data.type = 0;//登陆
                data.detail = '登录成功！';
                Log.userLog(data, function (result) {
                    if (result) {
                        delete data.password;
                        delete data.detail;
                        delete data.type;
                        res.json(new PKG(data));
                    }
                });
            });
        }
    });
}
router.post('/autoLogin', UsersRouter.autoLogin);


/**
 * 用户绑定支付宝
 * http://<tao_server:port>/users/bandAccount
 * @param  token、app_sid、ali_account、name
 */
UsersRouter.bandAccount = function (req, res) {
    var par = paramAll(req);
    if (!par.app_sid) return res.json(new ERR('产品标识不能为空', 400));
    if ((!par.ali_account || par.ali_account == '') && (!par.wx_account || par.wx_account == '')) return res.json(new ERR('绑定账号不为空', 400));
    if (par.ali_account && par.real_name) {
        var spellErr = checkAliAccAndName(par);
        if (spellErr) return res.json(new ERR(spellErr, 400));
    }
    UserToken.checkLoginByApp(par.token, function (err, loginInfo) {
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        par.uid = loginInfo.uid;
        UserDao.bandAccount(par, function (err, result) {
            if (err) {
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(result));
        });
    });
}
router.post('/bandAccount', UsersRouter.bandAccount);

function checkAliAccAndName(data) {
    var ali_account = data.ali_account;
    var real_name = data.real_name;
    var regChinese = /[\u4e00-\u9fa5]$/;
    if (regChinese.test(ali_account)) {
        return '您填写的账号含有中文，支付宝账号一般是您的手机号或邮箱，请检查下是否有误哦～ ';
    }
    if (!regChinese.test(real_name)) {
        return '您填写的真实姓名中包含非中文字符，请检查下是否填写正确哦～';
    }
    if (ali_account.indexOf(' ') >= 0) {
        return '您填写的账号中含有空格，请检查下是否拼写正确哦';
    }
    if (real_name.indexOf(' ') >= 0) {
        return '您填写的姓名中含有空格，请检查下是否拼写正确哦';
    }
    return null;
}

/**
 * 验证推荐码
 * http://<tao_server:port>/users/bandAccount
 * @param  token、app_sid、recommendCode
 */
UsersRouter.checkRCCode = function (req, res) {
    var par = paramAll(req);
    console.log(par);
    if (!checkSrvConnection(par)) return res.json(new ERR('访问受限', 400));
    if (!par.app_sid) return res.json(new ERR('产品标识不能为空', 400));
    if (!par.recommendCode) return res.json(new ERR('推荐码不为空', 400));
    par.uid = codeToUid(par.recommendCode);
    console.log(par.uid);
    UserDao.checkRCCode(par, function (err, result) {
        if (err) {
            res.json(new ERR(err, 400));
            return;
        }
        res.json(new PKG(result));
    });

}
router.post('/checkRCCode', UsersRouter.checkRCCode);


/**
 * 通过token修改密码
 * http://<tao_server:port>/users/setPwdByTk
 * @param  token   password  app_sid
 */
UsersRouter.setPwdByTk = function (req, res) {
    var par = paramAll(req);
    if (!par.token) return res.json(new ERR('token 不为空！', 400));
    if (!par.app_sid) return res.json(new ERR('app_sid 不为空！', 400));
    UserToken.checkLogin(par.token, function (err, loginInfo) {
        if (!loginInfo) {
            res.json(new ERR('请先登录', 403));
            return;
        }
        var userInfo = {};
        userInfo.uid = loginInfo.uid;
        userInfo.type = 1; //日志修改密码
        if (!par.password) return res.json(new ERR('新密码不能为空', 400));
        userInfo.password = encryPassword(par.password);
        userInfo.account = loginInfo.account;
        UserDao.resetPwd(userInfo, function (err) {
            if (err) {
                userInfo.detail = err;
                Log.userLog(userInfo, function (result) {
                    if (result) {
                        res.json(new ERR(err, 400));
                    }
                });
                return;
            }
            userInfo.detail = '重置密码成功！';
            Log.userLog(userInfo, function (data) {
                if (data) {
                    delete userInfo.type;
                    res.json(new PKG(userInfo));
                }
            });
        });

    });
}
router.post('/setPwdByTk', UsersRouter.setPwdByTk);

/**
 * 获取token里的信息
 * @param  token
 * @url    http://uc.htaoke.com/users/getTokenInfo
 */
UsersRouter.getTokenInfo = function (req, res) {
    var par = paramAll(req);
    UserToken.checkUserLogin(par.token, function (err, errCode, userInfo) {
        if (err) {
            res.json(new ERR(err, errCode));
            return;
        }
        res.json(new PKG(userInfo));
    });
};
router.post('/getTokenInfo', UsersRouter.getTokenInfo);

module.exports = router;